Artifact Registry プライベートリポジトリで Python 依存関係を管理する

Artifact Registry プライベートリポジトリで Python 依存関係を管理する

Artifact Registry でプライベートリポジトリを構成し、Python の依存関係を管理する方法について検証してみました。
Clock Icon2024.10.18

はじめに

Google Cloud 上の Cloud Run にデプロイするコンテナや Compute Engine といったワークロードに依存関係をインストールする際、外部リポジトリへのアクセスを制限していたり、インストール対象のパッケージを特定してガバナンスを効かせたい場合など、プライベートリポジトリを利用したいケースがあるかと思います。

今回は、そのようなケースで利用可能な Artifact Registry でプライベートリポジトリを構成し、Python 依存関係を管理する検証をしてみました。

Artifact Registry とは

コンテナイメージやパッケージといったアーティファクトを一元的に保存し管理できるレジストリとして機能させることが可能な Google Cloud のマネージドサービスです。Docker や Python といったさまざまなアーティファクトタイプを格納し、単一のプロジェクトに複数のリポジトリを作成することが可能です。

https://cloud.google.com/artifact-registry/docs/overview?hl=ja

Artifact Registry では以下の形式の保存が可能です。

  • Docker
  • Maven
  • npm
  • Python
  • Apt
  • Yum
  • Kubeflow
  • Go

詳細は以下をご参照ください。
https://cloud.google.com/artifact-registry/docs/supported-formats?hl=ja

やってみた

各種ワークロードから依存関係をインストールするために、外部リポジトリを参照せずに Artifact Registry のプライベートリポジトリを直接参照する検証を試してみます。

本検証では、Artifact Registry にプライベートリポジトリを作成し、Cloud Shell から Artifact Registry リポジトリに Python のパッケージを push、Artifact Registry リポジトリを参照して Cloud Shell に Python のパッケージをインストール、という簡易的な構成で検証します。

手順は以下を参照しています。
https://cloud.google.com/artifact-registry/docs/python/store-python?hl=ja

Artifact Registry でリポジトリを作成する

まずは Artifact Registry に、 Python のパッケージを管理するためのプライベートリポジトリを作成していきます。リポジトリの作成には Artifact Registry リポジトリ管理者 (roles/artifactregistry.repoAdmin) の権限が必要となりますが、本検証ではオーナー権限を持つユーザーで作業します。

Cloud Console から [Artifact Registry] -> [リポジトリ] を選択し、[リポジトリを作成] をクリックします。

リポジトリ – Artifact Registry – da-test – Google Cloud コンソール

以下のように設定し、画面下部の [作成] をクリックします。

  • 名前: 任意のリポジトリ名を指定。今回はprivate-python-package-repoとした。
  • 形式: Python を指定。
  • モード: 標準 を指定。標準リポジトリは非公開アーティファクト用のリポジトリで、イメージやパッケージのアップロードとダウンロードが可能。
  • ロケーションタイプ: リージョン か マルチリージョン を指定。今回はリージョンを指定し、asia-northeast1 とした。

リポジトリの作成 – Artifact Registry – da-test – Google Cloud コンソール

作成したリポジトリが表示されていることが確認できます。

リポジトリ – Artifact Registry – da-test – Google Cloud コンソール2

Python パッケージをアップロードする

Python パッケージをアップロードするには Twine が必要となります。 Twine は Python パッケージを PyPI などのリポジトリにアップロードすることができるツールです。

Cloud Shell から以下を実行し、Twine をインストールします。

pip install twine

PyPI によって提供されるサンプルパッケージである sampleproject を Cloud Shell にダウンロードします。

pip download sampleproject

Cloud Console から [Artifact Registry] -> [リポジトリ] を選択し、先ほど作成したリポジトリ名をクリックします。上部にあるディレクトリ名の横にあるコピーマークをクリックし、Artifact Registry リポジトリの URL を取得します。

private-python-package-repo のパッケージ – Artifact Registry – da-test – Google Cloud コンソール

コピーした URL を含めた以下コマンドを実行します。sampleproject-3.0.0-py3-none-any.whl は先ほどダウンロードした sampleproject のパッケージファイル名です。

python3 -m twine upload --repository-url <Repository URL> sampleproject-3.0.0-py3-none-any.whl

Cloud Console からリポジトリを確認すると、sampleprojectパッケージがアップロードされていることがわかります。

private-python-package-repo のパッケージ – Artifact Registry – da-test – Google Cloud コンソール2

Artifact Registry リポジトリを参照してパッケージをインストールしてみる

Cloud Shell を利用して Artifact Registry のプライベートリポジトリを参照した pip install を試してみます。(sampleproject は 他の依存関係が必要となりますが、今回は検証のために --no-deps で無視しています)

$ pip install --index-url <Repository URL> sampleproject --no-deps
Defaulting to user installation because normal site-packages is not writeable
Looking in indexes: <Repository URL>
Collecting sampleproject
  Downloading <Repository URL>/sampleproject-3.0.0-py3-none-any.whl (4.7 kB)
Installing collected packages: sampleproject
Successfully installed sampleproject-3.0.0
$ pip list | grep sampleproject
sampleproject                         3.0.0

Artifact Registry のプライベートリポジトリからパッケージをダウンロードしてインストールされたことがわかります。
なお、pip 構成ファイルを利用して --index-urlを指定せずにプライベートリポジトリのみを検索するように設定することも可能です。詳細は以下をご参照ください。

https://cloud.google.com/artifact-registry/docs/python/authentication?hl=ja

おわりに

今回は Cloud Shell で簡易的に検証しましたが、Compute Engine や Cloud Run などから Artifact Regsitry リポジトリを直接参照させる構成が可能です。その際、サービスアカウントで適切な権限を付与したり、VPC Service Controls で適切なサービス境界を設定するといった対応が必要になるためご注意ください。
それぞれのサービスからの接続方法については以下ドキュメントをご参照ください。

https://cloud.google.com/artifact-registry/docs/deploy?hl=ja

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.